iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
0

在還沒有進入多層感知機 MLP之前,Moore請大家注意這一段程式碼, Data Iteration,由於機器學習的數據集通常很大,不太可能一次導進記憶體,所以策略上是要使用一個批量時,再產出 (yield) 給使用需求,訓練器。具體實現如下:

def data_iter(batch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    random.shuffle(indices)  
    for i in range(0, num_examples, batch_size):
        j = nd.array(indices[i: min(i + batch_size, num_examples)])        
        yield features.take(j), labels.take(j) 

重點在資料打亂 (random.shuffle) 產生隨機性,並用 yield 吐出數據。其實在練習機器學習時,無論是用 Tensorflow,還是 Mxnet ,高階的Keras 都有提供訓練資料集的取用 API,我們通常不用花力氣自己製作,但是未來要在真實數據作業,就可能需要撰寫自己的 Data Iteration。

#Tensorflow Kera 提供房價預測線性迴歸的練習用數據 
from tensorflow import keras
boston_housing = keras.datasets.boston_housing

(train_data, train_labels), (test_data, test_labels) = boston_housing.load_data()

二元分類

在線性迴歸大家理解機器學習其中之一的演算法,也能拿其中一個框架 Mxnet Gluon 實作後,Fields 先簡單介紹一下分類問題,因為在現實裡,我們經常是用分類來解決問題,例如:圖像識別,我們可能要分辨照面裡面是否有貓,是二元分類問題。稍微複雜一點的是文字識別,例如車牌識別,我們要將上面的一塊區域轉換成某個英數,這也可以當作是36個圖示分類問題。

我們先從簡單的二元分類問題著手。線性迴歸所用的方程式 https://chart.googleapis.com/chart?cht=tx&chl=%5Chat%7By%7D%20%3D%20%7Bw%7D%5ET%20%7Bx%7D%20%2B%20b 這裡出現『T』這個符號是對w做轉置,修正前幾篇文章沒有特別標示我們做的是『矩陣內積』。

現在做二元分類,我們不需要預測值,反過來我們只要預測『是』『否』即可。策略上我們可以轉換成機率,機率超過一個門檻或者說『閾值』我們就猜『是』;反之我們猜否。所以公式變成:

https://chart.googleapis.com/chart?cht=tx&chl=%5Chat%7By%7D%20%3D%5Csigma(%7Bw%7D%5ET%20%20%7Bx%7D%20%2B%20b)

多加了一個稱為 sigmoid function 轉換 https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma ,或者另外一個比較有名的稱號 logistic function。所以有人把這個模型稱為 logistic regression 邏輯迴歸。sigmoid function 表達為:

https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma(z)%20%3D%20%5Cfrac%7B1%7D%7B1%20%2B%20e%5E%7B-z%7D%7D

可以把任何實數轉換為0到1。這個函數我們可以輕易的用python來撰寫,並畫出圖來表達

import mxnet as mx 
from mxnet import nd, autograd, gluon
import matplotlib.pyplot as plt

def logistic(z):
    return 1. / (1. + nd.exp(-z))
    
x = nd.arange(-5, 5, .1)    
y = logistic(x)
plt.plot(x.asnumpy(),y.asnumpy())
plt.show()

https://ithelp.ithome.com.tw/upload/images/20181104/20105283LYcbuOwsl4.png

分類問題的損失函數 推演:

原來做線性迴歸的損失函數 MSE 亦不可套用在分類問題了,我們推導一下思維,在樣本https://chart.googleapis.com/chart?cht=tx&chl=x_1%2C%20...%2C%20x_n我們就是要找到一組參數,目標是讓預測的https://chart.googleapis.com/chart?cht=tx&chl=(y_1%2C%20...%2C%20y_n) 機率最高,表達為:

https://chart.googleapis.com/chart?cht=tx&chl=%5Cmax_%7B%5Ctheta%7D%20P_%7B%5Ctheta%7D(%20(y_1%2C%20...%2C%20y_n)%20%7C%20%7Bx%7D_1%2C...%2C%7Bx%7D_n%20)

已知樣本之間是獨立事件,所以上面的公式就能轉換成:

https://chart.googleapis.com/chart?cht=tx&chl=%5Cmax_%7B%5Ctheta%7D%20P_%7B%5Ctheta%7D(y_1%7C%7Bx%7D_1)P_%7B%5Ctheta%7D(y_2%7C%7Bx%7D_2)%20...%20P(y_n%7C%7Bx%7D_n)

由於機率不會小於0,取 log 後,還是會得到的同樣的最佳參數參數 https://chart.googleapis.com/chart?cht=tx&chl=%5Ctheta ,這樣的目的是為了讓後續 mini-Batch 梯度計算容易。

https://chart.googleapis.com/chart?cht=tx&chl=%5Cmax_%7B%5Ctheta%7D%20%5Clog%20P_%7B%5Ctheta%7D(y_1%7C%7Bx%7D_1)%20%2B%20...%20%2B%20%5Clog%20P(y_n%7C%7Bx%7D_n)

還記得線性迴歸我們是要最佳化目標是要最小化『損失函數』吧?分類問題也是要損失函數,所以我們加一個 『-』號後,本來是『最大化機率』不就變成『最小化損失函數』:

https://chart.googleapis.com/chart?cht=tx&chl=%5Cmin_%7B%5Ctheta%7D%20%5Cleft(-%20%5Csum_%7Bi%3D1%7D%5En%20%5Clog%20P_%7B%5Ctheta%7D(y_i%7C%7Bx%7D_i)%5Cright) (公式一)

現在我們用 https://chart.googleapis.com/chart?cht=tx&chl=%5Chat%7By_i%7D 來表達 第 i 個樣本分類為『是』的機率(https://chart.googleapis.com/chart?cht=tx&chl=y_1%20%3D%201)。這樣就可以表達成:

https://chart.googleapis.com/chart?cht=tx&chl=P_%7B%5Ctheta%7D(y_i%7C%7Bx%7D_i)%20%3D%20%5Cbegin%7Bcases%7D%20%20%20%20%20%5Chat%7By%7D_i%2C%20%26%20%5Ctext%7Bif%20%7D%20y_i%20%3D%201%5C%5C%20%20%20%20%201-%5Chat%7By%7D_i%2C%20%26%20%5Ctext%7Bif%20%7D%20y_i%20%3D%200%20%5Cend%7Bcases%7D

我們可以用更簡潔的方式:

https://chart.googleapis.com/chart?cht=tx&chl=%20P_%7B%5Ctheta%7D(y_i%7C%5C%7Bx%7D_i)%20%3D%20%5Chat%7By%7D_i%5E%7By_i%7D(1-%5Chat%7By%7D_i)%5E%7B1-y_i%7D%20 (公式二)

結合上(公式一)與(公式二),我們就可以定義二元分類的損失函數:

https://chart.googleapis.com/chart?cht=tx&chl=%5Cell%20(%7By%7D%2C%20%7B%5Chat%7By%7D%7D)%20%3D%20%20-%20%5Csum_%7Bi%3D1%7D%5En%20y_i%20%5Clog%20%5Chat%7By%7D_i%20%2B%20(1-y_i)%20%5Clog%20(1-%5Chat%7By%7D_i)

結合兩個公式的這個推導還算簡單,就不討論了。能夠定義了損失函數後,後續就剩下取得訓練用的資料集,我們留待明天繼續。


佳麗聽到這裡已經要暈倒:"為何我們談的神經網路,到現在都只有數學,我看一堆科普談到AI的文章,常會看到什麼神經元,突觸的。怎麼都沒聽你們講起?"

Pete幫 Fields回答:"佳麗姐你如果有受騙的感覺,那我反覺得前人為了行銷這種演算法,把它包裝成類似人腦神經運作似的,這個策略很成功呢!騙了一堆人的關注,有資源了,才會像現在一樣的蓬勃發展"

備註:

專案緣起記錄在 【UP, Scrum 與 AI專案】


上一篇
梯度下降 與 Batch Size; 以 Gluon 實作
下一篇
二元分類實作;一般分類
系列文
深度學習所需入門知識--一位初學者的認知31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言